package com.heima.user.service.impl;


import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.heima.model.common.dtos.ResponseResult;
import com.heima.model.common.enums.AppHttpCodeEnum;
import com.heima.model.user.dtos.LoginDto;
import com.heima.model.user.pojos.ApUser;
import com.heima.user.mapper.ApUserMapper;
import com.heima.user.service.ApUserService;
import com.heima.utils.common.AppJwtUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;
import org.springframework.util.StringUtils;

@Service
public class ApUserServiceImpl implements ApUserService {
    @Autowired
    private ApUserMapper apUserMapper;
    @Override
    public ResponseResult login(LoginDto dto) {

        if(StringUtils.isEmpty(dto.getPhone())||StringUtils.isEmpty(dto.getPassword())){
            return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_REQUIRE);
        }

        ApUser apUser = apUserMapper.selectOne(Wrappers.<ApUser>lambdaQuery().eq(ApUser::getPhone, dto.getPhone()));
        if(apUser==null){
            return ResponseResult.errorResult(AppHttpCodeEnum.AP_USER_DATA_NOT_EXIST);
        }
        //比较密码 用户输入密码 原始密码
        String dbpassword = apUser.getPassword();//这个密码=原始密码+salt md5处理
        String inputPassword=dto.getPassword()+apUser.getSalt();
        String inputMd5Password = DigestUtils.md5DigestAsHex(inputPassword.getBytes());
        if (!dbpassword.equals(inputMd5Password)){
            return ResponseResult.errorResult(AppHttpCodeEnum.AP_USER_DATA_NOT_EXIST);
        }
        JSONObject result = new JSONObject();
        apUser.setSalt(null);//敏感数据掩盖
        result.put("user",apUser);
        result.put("token", AppJwtUtil.getToken(apUser.getId().longValue()));
        return ResponseResult.okResult(result);
    }

    /**
     * tringUtils.isEmpty(...): 这是核心判断方法。
     * 它来自 Apache Commons Lang 库或 Spring Framework 等工具库。
     * 它判断传入的字符串是否为空。
     * StringUtils.isEmpty(str) 的判断标准
     * 这个方法会同时检查两种情况，满足其中一种即返回 true（表示为空）：
     *
     * str == null：字符串对象本身为 null，表示这个引用没有指向任何内存中的字符串对象。
     *
     * str.equals("")：字符串对象存在，但其内容为空字符串（即长度为0）。
     */
}
